﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlServerCe;
using System.Data;

namespace GestionaleLib.Controller
{
    public class ctrlProdottiDettagli
    {
        #region "Testata"
        #region "Proprietà"
        private Connector Connessione;
        #endregion
        public enum Insert
        {
            Successo,
            Errore
        }
        public enum Edit
        {
            Successo,
            Errore
        }
        public enum Delete
        {
            Successo,
            Errore
        }
        #endregion
        private Prodotto Prodotto; //Imposto un oggetto prodotto come Testata

        public ctrlProdottiDettagli(Prodotto Prodotto)
        {
            Connessione = Connector.Istance();
            this.Prodotto = Prodotto;
        }
        /// <summary>
        /// Inserisce i dettagli del prodotto nel database
        /// </summary>
        /// <returns></returns>
        public Insert Nuovo()
        {
            try
            {
                string sql = @"
                    INSERT INTO ProdottoDettagli 
                        VALUES(@Id,@IdProdotto,@Caratteristica,@Valore)
                ";
                if (Prodotto.Dettagli == null) { return Insert.Errore; };
                foreach (ProdottoDettaglio item in Prodotto.Dettagli)
                {
                    SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);

                    SqlCeParameter id = new SqlCeParameter();
                    id.DbType = DbType.Guid;
                    id.ParameterName = "@Id";
                    id.Value = (Guid)item.Id;
                    cmd.Parameters.Add(id);

                    SqlCeParameter idprodotto = new SqlCeParameter();
                    idprodotto.DbType = DbType.Guid;
                    idprodotto.ParameterName = "@IdProdotto";
                    idprodotto.Value = (Guid)Prodotto.Id;
                    cmd.Parameters.Add(idprodotto);

                    SqlCeParameter caratteristica = new SqlCeParameter();
                    caratteristica.DbType = DbType.String;
                    caratteristica.ParameterName = "@Caratteristica";
                    if (item.Caratteristica != "")
                        caratteristica.Value = item.Caratteristica.ToString();
                    else
                        caratteristica.Value = DBNull.Value;
                    cmd.Parameters.Add(caratteristica);

                    SqlCeParameter valore = new SqlCeParameter();
                    valore.DbType = DbType.String;
                    valore.ParameterName = "@Valore";
                    if (item.Valore != "")
                        valore.Value =item.Valore.ToString();
                    else
                        valore.Value = DBNull.Value;
                    cmd.Parameters.Add(valore);

                    cmd.ExecuteNonQuery();
                }
                return Insert.Successo;
            }
            catch
            {
                throw new ExceptionErroreInserimento();
            }
        }
        /// <summary>
        /// Modifica la lista di dettagli di un prodotto
        /// </summary>
        /// <returns></returns>
        public Edit Modifica()
        {
            try
            {

                string sql = @"
                    UPDATE ProdottoDettagli SET 
                        Caratteristica=@Caratteristica,Valore=@Valore  
                    WHERE IdProdotto=@IdProdotto AND Id=@Id
                ";
                foreach (ProdottoDettaglio item in Prodotto.Dettagli)
                {
                    SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);

                    SqlCeParameter id = new SqlCeParameter();
                    id.DbType = DbType.Guid;
                    id.ParameterName = "@Id";
                    id.Value = (Guid)item.Id;
                    cmd.Parameters.Add(id);

                    SqlCeParameter idprodotto = new SqlCeParameter();
                    idprodotto.DbType = DbType.Guid;
                    idprodotto.ParameterName = "@IdProdotto";
                    idprodotto.Value = (Guid)Prodotto.Id;
                    cmd.Parameters.Add(idprodotto);

                    SqlCeParameter caratteristica = new SqlCeParameter();
                    caratteristica.DbType = DbType.Guid;
                    caratteristica.ParameterName = "@Caratteristica";
                    if (item.Caratteristica != "")
                        caratteristica.Value = item.Caratteristica.ToString();
                    else
                        caratteristica.Value = DBNull.Value;
                    cmd.Parameters.Add(caratteristica);

                    SqlCeParameter valore = new SqlCeParameter();
                    valore.DbType = DbType.Guid;
                    valore.ParameterName = "@Valore";
                    if (item.Valore != "")
                        valore.Value = item.Valore.ToString();
                    else
                        valore.Value = DBNull.Value;
                    cmd.Parameters.Add(valore);

                    cmd.ExecuteNonQuery();
                }
                return Edit.Successo;
            }
            catch
            {
                throw new ExceptionErroreModifica();
            }
        }
        /// <summary>
        /// Cancella le righe di un prdotto
        /// </summary>
        /// <param name="IdDettaglio"></param>
        /// <returns></returns>
        public Delete Cancella(Prodotto Prodotto)
        {
            try
            {
                string sql = @"
                    DELETE FROM ProdottoDettagli  
                        WHERE IdProdotto=@IdProdotto
                ";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@IdProdotto",(Guid) Prodotto.Id);
                cmd.ExecuteNonQuery();
                return Delete.Successo;
            }
            catch
            {
                throw new ExceptionErroreCancellazione();
            }
        }
        /// <summary>
        /// Cancella una singola riga di dettaglio prodotto
        /// </summary>
        /// <param name="IdDettaglio"></param>
        /// <returns></returns>
        public Delete Cancella(Guid IdDettaglio)
        {
            try
            {
                string sql = @"
                    DELETE FROM ProdottoDettagli  
                        WHERE Id=@Id
                ";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Id", IdDettaglio);
                cmd.ExecuteNonQuery();
                return Delete.Successo;
            }
            catch
            {
                throw new ExceptionErroreCancellazione();
            }
        }
        /// <summary>
        /// Seleziona tutti i dettagli by IDPRODOTTO
        /// </summary>
        /// <returns></returns>
        public List<ProdottoDettaglio> ProdottoById(Guid IdProdotto)
        {
            string sql = @"
                SELECT * FROM ProdottoDettagli  WHERE IdProdotto='"+IdProdotto+"'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<ProdottoDettaglio> ListaRitorno = new List<ProdottoDettaglio>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    ProdottoDettaglio ProdottoDettaglioRitorno = new ProdottoDettaglio();
                    ProdottoDettaglioRitorno.Id = (Guid)item["Id"];
                    if (item["Caratteristica"].ToString() != "")
                        ProdottoDettaglioRitorno.Caratteristica = item["Caratteristica"].ToString();
                    if (item["Valore"].ToString() != "")
                        ProdottoDettaglioRitorno.Valore = item["Valore"].ToString();

                    ListaRitorno.Add(ProdottoDettaglioRitorno);
                }
                return ListaRitorno;
            }
            return null;
        }
        /// <summary>
        /// Seleziona tutti i dettagli presenti nel prodotto
        /// </summary>
        /// <returns></returns>
        public List<ProdottoDettaglio> Seleziona()
        {
            string sql = @"
                SELECT * FROM ProdottoDettagli 
            ";
            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<ProdottoDettaglio> ListaRitorno = new List<ProdottoDettaglio>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    ProdottoDettaglio ProdottoDettaglioRitorno = new ProdottoDettaglio();
                    ProdottoDettaglioRitorno.Id = (Guid)item["Id"];
                    if (item["Caratteristica"].ToString() != "")
                        ProdottoDettaglioRitorno.Caratteristica = item["Caratteristica"].ToString();
                    if (item["Valore"].ToString() != "")
                        ProdottoDettaglioRitorno.Valore = item["Valore"].ToString();

                    ListaRitorno.Add(ProdottoDettaglioRitorno);
                }
                return ListaRitorno;
            }
            return null;
        }
        /// <summary>
        /// Seleziona oggetto dettaglio
        /// </summary>
        /// <returns></returns>
        public ProdottoDettaglio Seleziona(Guid IdDettaglio)
        {
            string sql = @"
                SELECT * FROM ProdottoDettagli 
                    WHERE Id='"+IdDettaglio+"'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                ProdottoDettaglio ProdottoDettaglioRitorno = new ProdottoDettaglio();
                ProdottoDettaglioRitorno.Id = (Guid)dt.Rows[0]["Id"];
                ProdottoDettaglioRitorno.Caratteristica = dt.Rows[0]["Caratteristica"].ToString();
                ProdottoDettaglioRitorno.Valore = dt.Rows[0]["Valore"].ToString();
                return ProdottoDettaglioRitorno;
            }
            return null;
        }
    }
}
